package Datos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.CallableStatement;
import java.util.*;

public class Liquidacion {
	Sesion oSesion;
	
	public Liquidacion() {};
	
	public int Add(Entidades.Liquidacion item) throws Exception{
		try{
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.LiquidacionAdd(?,?,?,?,?,?)}";
		CallableStatement cs =oCnn.prepareCall(storedProcedure);
		poneDatos(item,cs);
		boolean pipi = cs.execute();
		int numero = 0;
		if (pipi) numero = 1;
		return numero;
		
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
			   return -1;
		}
	}
	public void Update(Entidades.Liquidacion item) throws Exception{
		try{
			Connection oCnn = Datos.General.CrearConexion();
			String storedProcedure = "{call cpd.LiquidacionUpdate(?,?,?,?,?,?)}";
			CallableStatement cs =oCnn.prepareCall(storedProcedure);
			poneDatos(item,cs);
			boolean pipi = cs.execute();
			return;
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public void Delete(int id) throws Exception{
		try{
			Connection oCnn = Datos.General.CrearConexion();
			String storedProcedure = "{call cpd.LiquidacionDelete(?)}";
			CallableStatement cs =oCnn.prepareCall(storedProcedure);
			cs.setInt("mIdLiquidacion", id);

			boolean pipi = cs.execute();
			return;
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public List GetOne(int id) throws Exception{
		Statement stmt = null;   //
		ResultSet rs = null;	//
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.LiquidacionGetOne(?)}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		cs.setInt("mIdLiquidacion", id);
		rs = cs.executeQuery();
		return sacaDatos(rs);
	}
	public List GetAll() throws Exception{
		Statement stmt = null;   //
		ResultSet rs = null;	//
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.LiquidacionGetAll()}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		rs = cs.executeQuery();
		return sacaDatos(rs);
	}
	public List Consulta(String id) throws Exception{
		//Statement stmt = null;   //
		oSesion = new Sesion();
		ResultSet rs = null;	//
		String sql = "SELECT * FROM `Liquidacion` " + id + ";";
		rs = oSesion.getSesion().executeQuery(sql);
		/**
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.LiquidacionGetOne(?)}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		cs.setString("mIdLiquidacion", id);
		rs = cs.executeQuery();
		*/
		return sacaDatos(rs);
	}

	public List Primero() throws Exception{
		return Trae("FIRST");
	}
	public List Siguiente() throws Exception{
		return Trae("NEXT");
	}
	public List Anterior() throws Exception{
		return Trae("PREV");
	}
	public List Ultimo() throws Exception{
		return Trae("LAST");
	}
	public void Abrir() throws Exception{
		oSesion = new Sesion();
		try{
			String sql = "HANDLER `Liquidacion` OPEN";
			oSesion.getSesion().executeQuery(sql);
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public void Cerrar() throws Exception{
		try{
			String sql = "HANDLER `Liquidacion` CLOSE";
			oSesion.getSesion().executeQuery(sql);
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public List Trae(String condicion) throws Exception{
		ResultSet rs = null;	//
		String sql = "HANDLER `Liquidacion` READ `PRIMARY` " + condicion + "";
		rs = oSesion.getSesion().executeQuery(sql);  //
		return sacaDatos(rs);
	}
	private void poneDatos(Entidades.Liquidacion item, CallableStatement cs){
		try{
			cs.setInt("mIdLiquidacion", item.getIdLiquidacion());
			cs.setDouble("mNroLiquidacion", item.getNroLiquidacion());
			cs.setDate("mFecConcertacion",  new java.sql.Date(item.getFchConcertacion().getTime()));
			cs.setDate("mFecLiquidacion", new java.sql.Date(item.getFchLiquidacion().getTime()));
			cs.setString("mIdComitente", item.getComitente().getIdComitente());
			cs.setString("mIdTipoLiquidacion", item.getTipoLiquidacion().getIdTipoLiquidacion());
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	private List sacaDatos(ResultSet rs){
		List oDatos = new ArrayList();
		Entidades.Liquidacion oDato = null;
		String consulta = "";
		try {
			while(rs.next()){
				List oComitentes = new ArrayList();
				List oTipoLiquis = new ArrayList();
				try {
					Entidades.Comitente oComitente = null;
					Entidades.TipoLiquidacion oTipoLiqui = null;
					oComitentes = new Datos.Comitente().GetOne(rs.getString(5));
					oTipoLiquis = new Datos.TipoLiquidacion().GetOne(rs.getString(6));
					while(!oComitentes.isEmpty()){
						oComitente = (Entidades.Comitente) oComitentes.remove(0);
					}
					while(!oTipoLiquis.isEmpty()){
						oTipoLiqui = (Entidades.TipoLiquidacion) oTipoLiquis.remove(0);
					}
					List oLineasLiquidacion = new ArrayList();

					consulta = " WHERE (idLiquidacion=" + rs.getInt(1) + " ) ";

					//Entidades.LineaLiquidacion oLineaLiquidacion = null;
					oLineasLiquidacion = new Datos.LineaLiquidacion().Consulta(consulta);

					oDato = new Entidades.Liquidacion(
							rs.getInt(1),
							rs.getDouble(2),
							rs.getDate(3),
							rs.getDate(4),
							oComitente,
							oTipoLiqui,
							oLineasLiquidacion
							);
					oDatos.add(oDato);
					oDato = null;
				} catch (Exception ex){
					System.out.println("SQLException: " + ex.getMessage());
				}
			}
			rs.next();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return oDatos;
	}

}
